package pfc.etsii.ull.es.shared;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.moxieapps.gwt.highcharts.client.AxisTitle;
import org.moxieapps.gwt.highcharts.client.Chart;
import org.moxieapps.gwt.highcharts.client.Legend;
import org.moxieapps.gwt.highcharts.client.Style;
import org.moxieapps.gwt.highcharts.client.ToolTip;
import org.moxieapps.gwt.highcharts.client.ToolTipData;
import org.moxieapps.gwt.highcharts.client.ToolTipFormatter;
import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsData;
import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsFormatter;
import org.moxieapps.gwt.highcharts.client.labels.DataLabels;
import org.moxieapps.gwt.highcharts.client.labels.Labels;
import org.moxieapps.gwt.highcharts.client.labels.XAxisLabels;
import org.moxieapps.gwt.highcharts.client.labels.YAxisLabels;
import org.moxieapps.gwt.highcharts.client.plotOptions.PlotOptions;


import pfc.etsii.ull.es.shared.generated.Informe;
import pfc.etsii.ull.es.shared.utilidades.Conversor;
import pfc.etsii.ull.es.shared.utilidades.Mapeo;
import pfc.etsii.ull.es.shared.utilidades.Utiles;

public class Grafica implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3339511183179033631L;
	private Informe datos;
	private DatosSQL datosSQL;
	private String paramID;

	public String getParamID() {
		return paramID;
	}

	public void setParamID(String paramID) {
		this.paramID = paramID;
	}

	public DatosSQL getDatosSQL() {
		return datosSQL;
	}

	public void setDatosSQL(DatosSQL datosSQL) {
		this.datosSQL = datosSQL;
	}

	public Grafica() {
	}

	public Grafica(Informe datosXML) {
		this.datos = datosXML;
	}

	public Informe getDatos() {
		return datos;
	}

	public void setDatos(Informe datos) {
		this.datos = datos;
	}

	@SuppressWarnings("unchecked")
	public Chart pintarGrafica() {
		final Chart chart = new Chart();

		// General
		chart.setChartTitleText(datosSQL.getTituloGrafica());
		chart.setChartSubtitleText(datosSQL.getSubtituloGrafica());

		// Eje X		
		chart.getXAxis().setAxisTitle(new AxisTitle().setText(datosSQL.getTituloEjeX()).setStyle(new Style().setColor(datos.getGrafica().getEjeX().getTitulo().getColor())));
		chart.getXAxis().setCategories(Conversor.toArrayString(datosSQL.getDatosEjeX()));
		XAxisLabels xLabel = new XAxisLabels();
//		if (datos.getGrafica().getEjeX().getEtiquetas().getRotacion() != null)
//			chart.getXAxis().setLabels(xLabel.setRotation(
//					Integer.parseInt(datos.getGrafica().getEjeX().getEtiquetas().getRotacion().trim())));
//		if (datos.getGrafica().getEjeX().getEtiquetas().getAlineacion() != null)
//			chart.getXAxis().setLabels(xLabel.setY(
//					Integer.parseInt(datos.getGrafica().getEjeX().getEtiquetas().getPosY().trim())));

		// Eje Y
		for (Entry<Integer, String> tituloEjeY : datosSQL.getTitulosEjesY().entrySet()) {
			chart.getYAxis(tituloEjeY.getKey())
				.setAxisTitle(new AxisTitle()
					.setText(tituloEjeY.getValue())
					.setStyle(new Style().setColor(datos.getGrafica().getEjeY().get(tituloEjeY.getKey()).getTitulo().getColor()))
				);
		}
		
		
		for (Entry<Integer, Map<String, List<String>>> iteradorEjeY : datosSQL.getDatosSeries().entrySet()) {
				
				List<String> nombresSeries = datosSQL.getTitulosSeries().get(iteradorEjeY.getKey());
				List<String> listaTotal = new ArrayList<String>();
				int i = 0;
				
				while (i < nombresSeries.size()) {
					Map<String, List<String>> mapaSeries = (Map<String, List<String>>) iteradorEjeY.getValue();
					PlotOptions<?> opcionesGraficas = Utiles.crearOpciones(datos.getGrafica().getEjeY().get(iteradorEjeY.getKey()).getSerie().get(i).getTipo());
					opcionesGraficas.setColor(datos.getGrafica().getEjeY().get(iteradorEjeY.getKey()).getSerie().get(i).getColor());
					
					
					for (Entry<String, List<String>> serie : mapaSeries.entrySet()) {
						List<String> lista = (List<String>) serie.getValue();
						if (mapaSeries.entrySet().size() > 1) {
							chart.addSeries(chart.createSeries()
									.setName(nombresSeries.get(i) + " - [" + serie.getKey() + "]")
									.setType(Utiles.tipoSerie(datos.getGrafica().getEjeY().get(iteradorEjeY.getKey()).getSerie().get(i).getTipo()))
									.setPoints(Conversor.toArrayNumber(serie.getValue()))
									.setYAxis(iteradorEjeY.getKey())
									.setPlotOptions(opcionesGraficas)
							);
						} else {
							chart.addSeries(chart.createSeries()
									.setName(nombresSeries.get(i))
									.setType(Utiles.tipoSerie(datos.getGrafica().getEjeY().get(iteradorEjeY.getKey()).getSerie().get(i).getTipo()))
									.setPoints(Conversor.toArrayNumber(serie.getValue()))
									.setYAxis(iteradorEjeY.getKey())
									.setPlotOptions(opcionesGraficas)
							);
						}
						listaTotal = Utiles.uneListas(lista, listaTotal);
					}
					
					i++;
				}
				
				Number max = Utiles.maxEjeY(datos.getGrafica().getEjeY().get(iteradorEjeY.getKey()).getMax(), listaTotal);
				Number min = Utiles.minEjeY(datos.getGrafica().getEjeY().get(iteradorEjeY.getKey()).getMin(), listaTotal);
				
				chart.getYAxis(iteradorEjeY.getKey()).setEndOnTick(false);
				chart.getYAxis(iteradorEjeY.getKey()).setStartOnTick(false);
				
				chart.getYAxis(iteradorEjeY.getKey()).setExtremes(min, max);
				chart.getYAxis(iteradorEjeY.getKey()).setMax(max);
		 		chart.getYAxis(iteradorEjeY.getKey()).setMin(min);
			
		}
		
		
		// Leyenda
		chart.setLegend(new Legend()
			.setLayout(Legend.Layout.VERTICAL)
			.setX(Integer.parseInt(datos.getGrafica().getLeyenda().getPosX().trim()))
			.setY(Integer.parseInt(datos.getGrafica().getLeyenda().getPosY().trim()))
			.setFloating(Boolean.parseBoolean(datos.getGrafica().getLeyenda().getFlotante()))
			.setBackgroundColor(datos.getGrafica().getLeyenda().getColorFondo().trim())
			.setAlign(Utiles.alineacionHorizLeyenda(datos.getGrafica().getLeyenda().getAlineacion().trim()))
			.setVerticalAlign(Utiles.alineacionVertiLeyenda(datos.getGrafica().getLeyenda().getAlineacionVertical().trim()))
		);
		

		return chart;
	}

}
